library(tidyverse) # for data import, manipulation, viz
library(corrplot) # for correlation matix
library(stargazer) # visualize model fit
library(skimr) # generate summary statistics
library(car) # statistics 
library(lmtest) # linear modeling
str(crime_df)
wages_df = crime_df %>% mutate(crmrte_shift = crmrte + 1) %>% 
  select(crmrte_shift, wcon, wtuc, wtrd, wfir, wser, wmfg, wfed, wsta, wloc, taxpc) %>% 
  mutate_all(., log)
cor(wages_df)

wcon: construction wages have high positive correlation with all wages but no correlation with wsta and wser. wtuc: utility wages have high positive correlation with all wages but no correlation with wsta and wser. wtrd: retail wages have high positive correlation with all wages but no correlation with wsta and wser. wfir: finance wages have high positive correlation with all wages but no correlation with wsta and wser. wser: service wages low correlation with all other wages and tax per capita wmfg: manufacturing wages have high positive correlation with all wages but no correlation with wsta and wser. wfed: fed employees wages have high positive correlation with all wages but no correlation with wsta and wser. wsta: state employees wages no correlation with any variable but a bit with fed employees wloc: local government employees wages have high correlation with all wages but wsta taxpc: no correlation with any

ggplot(wages_df, aes(x=log(wcon), y=log(crmrte))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)

Wage Construction and Crime Rate have a high correlation

ggplot(wages_df, aes(x=log(wtuc), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wtrd), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wfir), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wser), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wmfg), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wfed), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wsta), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)
ggplot(wages_df, aes(x=log(wloc), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)

Wage Service and Crime Rate have no relationship. It could be because tips are an important part of the Service industry and they are not tracked easily.

ggplot(wages_df, aes(x=log(taxpc), y=log(crmrte + 1))) + 
  geom_point()+
  geom_smooth(method=lm, se=FALSE)

Include wloc and wsta and wtrd.

wtrd and wcon and wfir and wmfg

Then include taxpc.

data2 <- data2 %>% mutate(eff_cj = prbarr*prbconv*prbpris)
model1 = lm(log(crmrte + 1) ~ log(eff_cj) + log(wloc) + log(wsta) + log(wtrd), data = data2)
model1$coefficients
eff_cj_md = lm(log(crmrte) ~ log(eff_cj), data = data2)
eff_cj_md$coefficients
plot(eff_cj_md)
wloc_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc), data = data2)
wloc_md$coefficients
plot(wloc_md)
wloc_tax_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(taxpc), data = data2)
wloc_tax_md$coefficients
plot(wloc_tax_md)
wloc_trd_tax_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wtrd) + log(taxpc), data = data2)
wloc_trd_md$coefficients
plot(wloc_trd_tax_md)

No noticeable improvement from adding wcon

wloc_con_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wcon), data = data2)
wloc_con_md$coefficients
plot(wloc_con_md)

No noticeable improvement by adding wtrd

wloc_trd_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wtrd), data = data2)
wloc_trd_md$coefficients
plot(wloc_trd_md)

No noticible improvement by adding wsta

wloc_sta_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(wsta), data = data2)
plot(wloc_sta_md)
wtrd_md = lm(log(crmrte) ~ log(eff_cj) + log(wtrd), data = data2)
wtrd_md$coefficients
(Intercept) log(eff_cj)   log(wtrd) 
 -11.530276   -0.442810    1.249529 
plot(wtrd_md)

deomographics

demo_df =  data2 %>%  select(crmrte, eff_cj, wloc, wtrd, density, pctmin80, pctymle) %>%
  mutate_all(., log)
cor(demo_df)
             crmrte       eff_cj        wloc        wtrd     density     pctmin80      pctymle
crmrte    1.0000000 -0.561313323 0.302867062  0.38965891  0.49364251  0.397290965  0.311754030
eff_cj   -0.5613133  1.000000000 0.007855728 -0.09396993 -0.13895393  0.039442815 -0.372393035
wloc      0.3028671  0.007855728 1.000000000  0.57419433  0.30295286  0.015342980  0.022589116
wtrd      0.3896589 -0.093969928 0.574194331  1.00000000  0.42921817  0.046240863 -0.097848085
density   0.4936425 -0.138953934 0.302952858  0.42921817  1.00000000 -0.018819680  0.175156111
pctmin80  0.3972910  0.039442815 0.015342980  0.04624086 -0.01881968  1.000000000  0.008048105
pctymle   0.3117540 -0.372393035 0.022589116 -0.09784808  0.17515611  0.008048105  1.000000000
wloc_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc), data = data2)
wloc_md$coefficients
(Intercept) log(eff_cj)   log(wloc) 
 -15.692389   -0.471548    1.872709 
plot(wloc_md)

ymale_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(pctymle), data = data2)
ymale_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(pctymle) 
-16.78712764  -0.50121797   2.09661595   0.01214476   0.23631352 
plot(ymale_min_md)

ymale_density_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(density) + log(pctymle), data = data2)
ymale_density_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(density) log(pctymle) 
-13.18459542  -0.47571392   1.41925751   0.01275751   0.15036226   0.09299417 
plot(ymale_density_min_md)

Improves Heteroskedasticity

density_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 + log(density), data = data2)
density_min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 log(density) 
-13.43963749  -0.48599161   1.41756663   0.01282803   0.15215117 
plot(density_min_md)

Improves zero conditional mean and heteroskedasticity significantly

min_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + pctmin80 , data = data2)
min_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc)     pctmin80 
-17.55828744  -0.52860856   2.11310007   0.01230844 
plot(min_md)

wtrd_min_md = lm(log(crmrte) ~ log(eff_cj) + log(wtrd) + log(pctmin80) , data = data2)
wtrd_min_md$coefficients
  (Intercept)   log(eff_cj)     log(wtrd) log(pctmin80) 
  -11.8484351    -0.4577432     1.1746727     0.2311788 
plot(wtrd_min_md)

No change after adding pctymle

ymale_md = lm(log(crmrte) ~ log(eff_cj) + log(wloc) + log(pctymle), data = data2)
ymale_md$coefficients
 (Intercept)  log(eff_cj)    log(wloc) log(pctymle) 
 -14.7294721   -0.4371883    1.8555659    0.3048858 
plot(ymale_md)

geography

geo_df = data2 %>% mutate(ln_crmrte = log(crmrte), ln_eff_cj = log(eff_cj), ln_wloc = log(wloc), ln_wtrd = log(wtrd), ln_density = log(density), ln_taxpc = log(taxpc)) %>% 
  mutate(west_proper = ifelse(west == 1 & central != 1, 1, 0), central_proper = ifelse(west != 1 & central == 1, 1, 0)) %>% 
  select(ln_crmrte, ln_eff_cj, ln_wloc, ln_wtrd, ln_density, ln_taxpc, pctmin80, urban, west, central, west_proper)

cor(geo_df)
             ln_crmrte    ln_eff_cj      ln_wloc     ln_wtrd  ln_density    ln_taxpc    pctmin80       urban        west     central west_proper
ln_crmrte    1.0000000 -0.561313323  0.302867062  0.38965891  0.49364251  0.33984322  0.23291821  0.49146445 -0.41439959  0.18471924 -0.45141763
ln_eff_cj   -0.5613133  1.000000000  0.007855728 -0.09396993 -0.13895393 -0.26364343  0.17824194 -0.31631198  0.04357931 -0.05102979  0.07985026
ln_wloc      0.3028671  0.007855728  1.000000000  0.57419433  0.30295286  0.22092405 -0.10213445  0.33004924 -0.12518869  0.33062751 -0.15296513
ln_wtrd      0.3896589 -0.093969928  0.574194331  1.00000000  0.42921817  0.16350047 -0.07527956  0.39889779 -0.17146795  0.38409287 -0.19939002
ln_density   0.4936425 -0.138953934  0.302952858  0.42921817  1.00000000  0.10798692 -0.09668387  0.39272648 -0.21493695  0.28825936 -0.25035461
ln_taxpc     0.3398432 -0.263643431  0.220924053  0.16350047  0.10798692  1.00000000  0.02947733  0.39785937 -0.20386931  0.05466066 -0.19215618
pctmin80     0.2329182  0.178241937 -0.102134449 -0.07527956 -0.09668387  0.02947733  1.00000000  0.01619569 -0.63360382 -0.05487554 -0.62451443
urban        0.4914645 -0.316311979  0.330049244  0.39889779  0.39272648  0.39785937  0.01619569  1.00000000 -0.08681219  0.15927023 -0.08000341
west        -0.4143996  0.043579312 -0.125188688 -0.17146795 -0.21493695 -0.20386931 -0.63360382 -0.08681219  1.00000000 -0.38987611  0.96990281
central      0.1847192 -0.051029790  0.330627510  0.38409287  0.28825936  0.05466066 -0.05487554  0.15927023 -0.38987611  1.00000000 -0.42986348
west_proper -0.4514176  0.079850262 -0.152965131 -0.19939002 -0.25035461 -0.19215618 -0.62451443 -0.08000341  0.96990281 -0.42986348  1.00000000

pctmin80 has high correlation with west but it has opposite impact on crmrte. urban is highly correlated with other variables, exclude. There is some overlap between west or central though they have opposity effects on crmrte. Parse variables. test: pctmin80 vs west_proper.

data2 = data2 %>% mutate(west_proper = ifelse(west == 1 & central != 1, 1, 0))

Benchmark

density_min_md = lm(log(crmrte) ~ log(eff_cj) + log(density) + pctmin80, data = data2)
density_min_md$coefficients
 (Intercept)  log(eff_cj) log(density)     pctmin80 
 -5.24656874  -0.47332224   0.18038857   0.01219402 
plot(density_min_md)

wtrd_west_md = lm(log(crmrte) ~ log(eff_cj) + log(density) + west_proper, data = data2)
wtrd_west_md$coefficients
 (Intercept)  log(eff_cj) log(density)  west_proper 
  -4.6434990   -0.4077235    0.1375235   -0.4210135 
plot(wtrd_west_md)

west

west_md = lm(log(crmrte) ~ log(acj) + log(wtrd) + log(density) + west_proper, data = data2)
Error in eval(predvars, data, env) : object 'west_proper' not found
plot(west_md)

plot(density_min_md$fitted.values, log(data2$crmrte), main = "Actual vs Predicted")
abline(a=0,b=1)

plot(west_md$fitted.values, log(data2$crmrte), main = "Actual vs Predicted")
abline(a=0,b=1)

stargazer(density_min_md, wtrd_west_md, type = "text")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

==========================================================
                                  Dependent variable:     
                              ----------------------------
                                      log(crmrte)         
                                   (1)            (2)     
----------------------------------------------------------
log(eff_cj)                     -0.473***      -0.408***  
                                 (0.056)        (0.058)   
                                                          
log(density)                     0.180***      0.138***   
                                 (0.027)        (0.029)   
                                                          
pctmin80                         0.012***                 
                                 (0.002)                  
                                                          
west_proper                                    -0.421***  
                                                (0.092)   
                                                          
Constant                        -5.247***      -4.643***  
                                 (0.189)        (0.180)   
                                                          
----------------------------------------------------------
Observations                        90            90      
R2                                0.628          0.591    
Adjusted R2                       0.615          0.577    
Residual Std. Error (df = 86)     0.340          0.357    
F Statistic (df = 3; 86)        48.480***      41.393***  
==========================================================
Note:                          *p<0.1; **p<0.05; ***p<0.01

Feature Engineering: Density

crime_density_md$coefficients
(Intercept) log(eff_cj) 
 -5.8877067  -0.7604551 

crime_density_2_md = lm(log(crmrte * density) ~ log(eff_cj) + log(pctmin80 * density), data = data2)
crime_density_2_md$coefficients
            (Intercept)             log(eff_cj) log(pctmin80 * density) 
             -7.7354360              -0.5585187               0.8657340 

plot(crime_density_2_md$fitted.values, log(data2$crmrte), main = "Actual vs Predicted")
abline(a=0,b=1)

stargazer(density_min_md, wtrd_west_md, crime_density_2_md, type = "text")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changednumber of rows of result is not a multiple of vector length (arg 2)

============================================================================================
                                                Dependent variable:                         
                        --------------------------------------------------------------------
                                                    log(crmrte)                             
                                 (1)                    (2)                    (3)          
--------------------------------------------------------------------------------------------
log(eff_cj)                   -0.473***              -0.408***              -0.424***       
                               (0.056)                (0.058)                (0.052)        
                                                                                            
log(density)                   0.180***               0.138***                              
                               (0.027)                (0.029)                               
                                                                                            
pctmin80                       0.012***                                                     
                               (0.002)                                                      
                                                                                            
west_proper                                          -0.421***                              
                                                      (0.092)                               
                                                                                            
log(pctmin80 * density)                                                      0.195***       
                                                                             (0.021)        
                                                                                            
Constant                      -5.247***              -4.643***              -5.354***       
                               (0.189)                (0.180)                (0.165)        
                                                                                            
--------------------------------------------------------------------------------------------
Observations                      90                     90                     90          
R2                              0.628                  0.591                  0.662         
Adjusted R2                     0.615                  0.577                  0.654         
Residual Std. Error        0.340 (df = 86)        0.357 (df = 86)        0.323 (df = 87)    
F Statistic             48.480*** (df = 3; 86) 41.393*** (df = 3; 86) 85.029*** (df = 2; 87)
============================================================================================
Note:                                                            *p<0.1; **p<0.05; ***p<0.01
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKSAjIGZvciBkYXRhIGltcG9ydCwgbWFuaXB1bGF0aW9uLCB2aXoKbGlicmFyeShjb3JycGxvdCkgIyBmb3IgY29ycmVsYXRpb24gbWF0aXgKbGlicmFyeShzdGFyZ2F6ZXIpICMgdmlzdWFsaXplIG1vZGVsIGZpdApsaWJyYXJ5KHNraW1yKSAjIGdlbmVyYXRlIHN1bW1hcnkgc3RhdGlzdGljcwpsaWJyYXJ5KGNhcikgIyBzdGF0aXN0aWNzIApsaWJyYXJ5KGxtdGVzdCkgIyBsaW5lYXIgbW9kZWxpbmcKYGBgCgpgYGB7cn0Kc3RyKGNyaW1lX2RmKQpgYGAKCmBgYHtyfQp3YWdlc19kZiA9IGNyaW1lX2RmICU+JSBtdXRhdGUoY3JtcnRlX3NoaWZ0ID0gY3JtcnRlICsgMSkgJT4lIAogIHNlbGVjdChjcm1ydGVfc2hpZnQsIHdjb24sIHd0dWMsIHd0cmQsIHdmaXIsIHdzZXIsIHdtZmcsIHdmZWQsIHdzdGEsIHdsb2MsIHRheHBjKSAlPiUgCiAgbXV0YXRlX2FsbCguLCBsb2cpCmNvcih3YWdlc19kZikKYGBgCgpgd2NvbmA6IGNvbnN0cnVjdGlvbiB3YWdlcyBoYXZlIGhpZ2ggcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBhbGwgd2FnZXMgYnV0IG5vIGNvcnJlbGF0aW9uIHdpdGggYHdzdGFgIGFuZCBgd3NlcmAuCmB3dHVjYDogdXRpbGl0eSB3YWdlcyBoYXZlIGhpZ2ggcG9zaXRpdmUgY29ycmVsYXRpb24gd2l0aCBhbGwgd2FnZXMgYnV0IG5vIGNvcnJlbGF0aW9uIHdpdGggYHdzdGFgIGFuZCBgd3NlcmAuCmB3dHJkYDogcmV0YWlsIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdmaXJgOiBmaW5hbmNlIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdzZXJgOiBzZXJ2aWNlIHdhZ2VzIGxvdyBjb3JyZWxhdGlvbiB3aXRoIGFsbCBvdGhlciB3YWdlcyBhbmQgdGF4IHBlciBjYXBpdGEKYHdtZmdgOiBtYW51ZmFjdHVyaW5nIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdmZWRgOiBmZWQgZW1wbG95ZWVzIHdhZ2VzIGhhdmUgaGlnaCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgbm8gY29ycmVsYXRpb24gd2l0aCBgd3N0YWAgYW5kIGB3c2VyYC4KYHdzdGFgOiBzdGF0ZSBlbXBsb3llZXMgd2FnZXMgbm8gY29ycmVsYXRpb24gd2l0aCBhbnkgdmFyaWFibGUgYnV0IGEgYml0IHdpdGggZmVkIGVtcGxveWVlcwpgd2xvY2A6IGxvY2FsIGdvdmVybm1lbnQgZW1wbG95ZWVzIHdhZ2VzIGhhdmUgaGlnaCBjb3JyZWxhdGlvbiB3aXRoIGFsbCB3YWdlcyBidXQgYHdzdGFgCmB0YXhwY2A6IG5vIGNvcnJlbGF0aW9uIHdpdGggYW55CgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod2NvbiksIHk9bG9nKGNybXJ0ZSkpKSArIAogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKQpgYGAKCldhZ2UgQ29uc3RydWN0aW9uIGFuZCBDcmltZSBSYXRlIGhhdmUgYSBoaWdoIGNvcnJlbGF0aW9uCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod3R1YyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod3RyZCksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod2ZpciksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgoKCmBgYHtyfQpnZ3Bsb3Qod2FnZXNfZGYsIGFlcyh4PWxvZyh3c2VyKSwgeT1sb2coY3JtcnRlICsgMSkpKSArIAogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKQpgYGAKCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod21mZyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgoKYGBge3J9CmdncGxvdCh3YWdlc19kZiwgYWVzKHg9bG9nKHdmZWQpLCB5PWxvZyhjcm1ydGUgKyAxKSkpICsgCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgc2U9RkFMU0UpCmBgYAoKCmBgYHtyfQpnZ3Bsb3Qod2FnZXNfZGYsIGFlcyh4PWxvZyh3c3RhKSwgeT1sb2coY3JtcnRlICsgMSkpKSArIAogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUZBTFNFKQpgYGAKCgpgYGB7cn0KZ2dwbG90KHdhZ2VzX2RmLCBhZXMoeD1sb2cod2xvYyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpXYWdlIFNlcnZpY2UgYW5kIENyaW1lIFJhdGUgaGF2ZSBubyByZWxhdGlvbnNoaXAuIEl0IGNvdWxkIGJlIGJlY2F1c2UgdGlwcyBhcmUgYW4gaW1wb3J0YW50IHBhcnQgb2YgdGhlIFNlcnZpY2UgaW5kdXN0cnkgYW5kIHRoZXkgYXJlIG5vdCB0cmFja2VkIGVhc2lseS4KCmBgYHtyfQpnZ3Bsb3Qod2FnZXNfZGYsIGFlcyh4PWxvZyh0YXhwYyksIHk9bG9nKGNybXJ0ZSArIDEpKSkgKyAKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GQUxTRSkKYGBgCgpJbmNsdWRlIGB3bG9jYCBhbmQgYHdzdGFgIGFuZCBgd3RyZGAuCgpgd3RyZGAgYW5kIGB3Y29uYCBhbmQgYHdmaXJgIGFuZCBgd21mZ2AgCgpUaGVuIGluY2x1ZGUgYHRheHBjYC4KCmBgYHtyfQpkYXRhMiA8LSBkYXRhMiAlPiUgbXV0YXRlKGVmZl9jaiA9IHByYmFycipwcmJjb252KnByYnByaXMpCmBgYAoKYGBge3J9Cm1vZGVsMSA9IGxtKGxvZyhjcm1ydGUgKyAxKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHdzdGEpICsgbG9nKHd0cmQpLCBkYXRhID0gZGF0YTIpCm1vZGVsMSRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CmVmZl9jal9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaiksIGRhdGEgPSBkYXRhMikKZWZmX2NqX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdChlZmZfY2pfbWQpCmBgYAoKYGBge3J9Cndsb2NfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpLCBkYXRhID0gZGF0YTIpCndsb2NfbWQkY29lZmZpY2llbnRzCmBgYAoKCmBgYHtyfQpwbG90KHdsb2NfbWQpCmBgYAoKYGBge3J9Cndsb2NfdGF4X21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIGxvZyh0YXhwYyksIGRhdGEgPSBkYXRhMikKd2xvY190YXhfbWQkY29lZmZpY2llbnRzCmBgYAoKCmBgYHtyfQpwbG90KHdsb2NfdGF4X21kKQpgYGAKCmBgYHtyfQp3bG9jX3RyZF90YXhfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHd0cmQpICsgbG9nKHRheHBjKSwgZGF0YSA9IGRhdGEyKQp3bG9jX3RyZF9tZCRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CnBsb3Qod2xvY190cmRfdGF4X21kKQpgYGAKCgpObyBub3RpY2VhYmxlIGltcHJvdmVtZW50IGZyb20gYWRkaW5nIGB3Y29uYApgYGB7cn0Kd2xvY19jb25fbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHdjb24pLCBkYXRhID0gZGF0YTIpCndsb2NfY29uX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3bG9jX2Nvbl9tZCkKYGBgCgoKCk5vIG5vdGljZWFibGUgaW1wcm92ZW1lbnQgYnkgYWRkaW5nIGB3dHJkYApgYGB7cn0Kd2xvY190cmRfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHd0cmQpLCBkYXRhID0gZGF0YTIpCndsb2NfdHJkX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3bG9jX3RyZF9tZCkKYGBgCgoKCk5vIG5vdGljaWJsZSBpbXByb3ZlbWVudCBieSBhZGRpbmcgYHdzdGFgCmBgYHtyfQp3bG9jX3N0YV9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaikgKyBsb2cod2xvYykgKyBsb2cod3N0YSksIGRhdGEgPSBkYXRhMikKYGBgCgoKYGBge3J9CnBsb3Qod2xvY19zdGFfbWQpCmBgYAoKCmBgYHtyfQp3dHJkX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3dHJkKSwgZGF0YSA9IGRhdGEyKQp3dHJkX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3dHJkX21kKQpgYGAKCiMgZGVvbW9ncmFwaGljcwoKYGBge3J9CmRlbW9fZGYgPSAgZGF0YTIgJT4lICBzZWxlY3QoY3JtcnRlLCBlZmZfY2osIHdsb2MsIHd0cmQsIGRlbnNpdHksIHBjdG1pbjgwLCBwY3R5bWxlKSAlPiUKICBtdXRhdGVfYWxsKC4sIGxvZykKY29yKGRlbW9fZGYpCmBgYAoKCmBgYHtyfQp3bG9jX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSwgZGF0YSA9IGRhdGEyKQp3bG9jX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3bG9jX21kKQpgYGAKCgpgYGB7cn0KeW1hbGVfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIHBjdG1pbjgwICsgbG9nKHBjdHltbGUpLCBkYXRhID0gZGF0YTIpCnltYWxlX21pbl9tZCRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CnBsb3QoeW1hbGVfbWluX21kKQpgYGAKCmBgYHtyfQp5bWFsZV9kZW5zaXR5X21pbl9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGVmZl9jaikgKyBsb2cod2xvYykgKyBwY3RtaW44MCArIGxvZyhkZW5zaXR5KSArIGxvZyhwY3R5bWxlKSwgZGF0YSA9IGRhdGEyKQp5bWFsZV9kZW5zaXR5X21pbl9tZCRjb2VmZmljaWVudHMKYGBgCgoKYGBge3J9CnBsb3QoeW1hbGVfZGVuc2l0eV9taW5fbWQpCmBgYAoKCgpJbXByb3ZlcyBIZXRlcm9za2VkYXN0aWNpdHkKYGBge3J9CmRlbnNpdHlfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIHBjdG1pbjgwICsgbG9nKGRlbnNpdHkpLCBkYXRhID0gZGF0YTIpCmRlbnNpdHlfbWluX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdChkZW5zaXR5X21pbl9tZCkKYGBgCgoKSW1wcm92ZXMgemVybyBjb25kaXRpb25hbCBtZWFuIGFuZCBoZXRlcm9za2VkYXN0aWNpdHkgc2lnbmlmaWNhbnRseQpgYGB7cn0KbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3bG9jKSArIHBjdG1pbjgwICwgZGF0YSA9IGRhdGEyKQptaW5fbWQkY29lZmZpY2llbnRzCmBgYAoKCmBgYHtyfQpwbG90KG1pbl9tZCkKYGBgCgoKYGBge3J9Cnd0cmRfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyh3dHJkKSArIGxvZyhwY3RtaW44MCkgLCBkYXRhID0gZGF0YTIpCnd0cmRfbWluX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh3dHJkX21pbl9tZCkKYGBgCgpObyBjaGFuZ2UgYWZ0ZXIgYWRkaW5nIGBwY3R5bWxlYApgYGB7cn0KeW1hbGVfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHdsb2MpICsgbG9nKHBjdHltbGUpLCBkYXRhID0gZGF0YTIpCnltYWxlX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdCh5bWFsZV9tZCkKYGBgCgojIyBnZW9ncmFwaHkKCgpgYGB7cn0KZ2VvX2RmID0gZGF0YTIgJT4lIG11dGF0ZShsbl9jcm1ydGUgPSBsb2coY3JtcnRlKSwgbG5fZWZmX2NqID0gbG9nKGVmZl9jaiksIGxuX3dsb2MgPSBsb2cod2xvYyksIGxuX3d0cmQgPSBsb2cod3RyZCksIGxuX2RlbnNpdHkgPSBsb2coZGVuc2l0eSksIGxuX3RheHBjID0gbG9nKHRheHBjKSkgJT4lIAogIG11dGF0ZSh3ZXN0X3Byb3BlciA9IGlmZWxzZSh3ZXN0ID09IDEgJiBjZW50cmFsICE9IDEsIDEsIDApLCBjZW50cmFsX3Byb3BlciA9IGlmZWxzZSh3ZXN0ICE9IDEgJiBjZW50cmFsID09IDEsIDEsIDApKSAlPiUgCiAgc2VsZWN0KGxuX2NybXJ0ZSwgbG5fZWZmX2NqLCBsbl93bG9jLCBsbl93dHJkLCBsbl9kZW5zaXR5LCBsbl90YXhwYywgcGN0bWluODAsIHVyYmFuLCB3ZXN0LCBjZW50cmFsLCB3ZXN0X3Byb3BlcikKCmNvcihnZW9fZGYpCmBgYApgcGN0bWluODBgIGhhcyBoaWdoIGNvcnJlbGF0aW9uIHdpdGggYHdlc3RgIGJ1dCBpdCBoYXMgb3Bwb3NpdGUgaW1wYWN0IG9uIGBjcm1ydGVgLgpgdXJiYW5gIGlzIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggb3RoZXIgdmFyaWFibGVzLCBleGNsdWRlLgpUaGVyZSBpcyBzb21lIG92ZXJsYXAgYmV0d2VlbiBgd2VzdGAgb3IgYGNlbnRyYWxgIHRob3VnaCB0aGV5IGhhdmUgb3Bwb3NpdHkgZWZmZWN0cyBvbiBgY3JtcnRlYC4gUGFyc2UgdmFyaWFibGVzLiAKdGVzdDogYHBjdG1pbjgwYCB2cyBgd2VzdF9wcm9wZXJgLgoKYGBge3J9CmRhdGEyID0gZGF0YTIgJT4lIG11dGF0ZSh3ZXN0X3Byb3BlciA9IGlmZWxzZSh3ZXN0ID09IDEgJiBjZW50cmFsICE9IDEsIDEsIDApKQpgYGAKCgpCZW5jaG1hcmsKYGBge3J9CmRlbnNpdHlfbWluX21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyhkZW5zaXR5KSArIHBjdG1pbjgwLCBkYXRhID0gZGF0YTIpCmRlbnNpdHlfbWluX21kJGNvZWZmaWNpZW50cwpgYGAKCgpgYGB7cn0KcGxvdChkZW5zaXR5X21pbl9tZCkKYGBgCgpgYGB7cn0Kd3RyZF93ZXN0X21kID0gbG0obG9nKGNybXJ0ZSkgfiBsb2coZWZmX2NqKSArIGxvZyhkZW5zaXR5KSArIHdlc3RfcHJvcGVyLCBkYXRhID0gZGF0YTIpCnd0cmRfd2VzdF9tZCRjb2VmZmljaWVudHMKYGBgCgpgYGB7cn0KcGxvdCh3dHJkX3dlc3RfbWQpCmBgYAoKd2VzdApgYGB7cn0Kd2VzdF9tZCA9IGxtKGxvZyhjcm1ydGUpIH4gbG9nKGFjaikgKyBsb2cod3RyZCkgKyBsb2coZGVuc2l0eSkgKyB3ZXN0X3Byb3BlciwgZGF0YSA9IGRhdGEyKQp3ZXN0X21kJGNvZWZmaWNpZW50cwpgYGAKCmBgYHtyfQpwbG90KHdlc3RfbWQpCmBgYAoKCmBgYHtyfQpwbG90KGRlbnNpdHlfbWluX21kJGZpdHRlZC52YWx1ZXMsIGxvZyhkYXRhMiRjcm1ydGUpLCBtYWluID0gIkFjdHVhbCB2cyBQcmVkaWN0ZWQiKQphYmxpbmUoYT0wLGI9MSkKYGBgCgpgYGB7cn0KcGxvdCh3ZXN0X21kJGZpdHRlZC52YWx1ZXMsIGxvZyhkYXRhMiRjcm1ydGUpLCBtYWluID0gIkFjdHVhbCB2cyBQcmVkaWN0ZWQiKQphYmxpbmUoYT0wLGI9MSkKYGBgCgpgYGB7cn0Kc3RhcmdhemVyKGRlbnNpdHlfbWluX21kLCB3dHJkX3dlc3RfbWQsIHR5cGUgPSAidGV4dCIpCmBgYAoKIyMgRmVhdHVyZSBFbmdpbmVlcmluZzogRGVuc2l0eQoKCmBgYHtyfQpoaXN0KGRhdGEyJGRlbnNpdHkpCmBgYAoKYGBge3J9Cmhpc3QoIGRhdGEyJHBjdG1pbjgwKQpgYGAKCgpgYGB7cn0KaGlzdChkYXRhMiRjcm1ydGUpCmBgYAoKYGBge3J9Cmhpc3QoZGF0YTIkcG9scGMpCmBgYAoKCgpgYGB7cn0KaGlzdChkYXRhMiRjcm1ydGUgKiBkYXRhMiRkZW5zaXR5KQpgYGAKCgpgYGB7cn0KaGlzdChkYXRhMiRkZW5zaXR5ICogZGF0YTIkcGN0bWluODApCmBgYAoKYGBge3J9Cmhpc3QoZGF0YTIkZGVuc2l0eSAqIGRhdGEyJHBvbHBjKQpgYGAKCmBgYHtyfQpjcmltZV9kZW5zaXR5X21kID0gbG0obG9nKGNybXJ0ZSAqIGRlbnNpdHkpIH4gbG9nKGVmZl9jaiksIGRhdGEgPSBkYXRhMikKY3JpbWVfZGVuc2l0eV9tZCRjb2VmZmljaWVudHMKYGBgCgpgYGB7cn0KcGxvdChjcmltZV9kZW5zaXR5X21kKQpgYGAKCmBgYHtyfQpjcmltZV9kZW5zaXR5XzJfbWQgPSBsbShsb2coY3JtcnRlKSB+IGxvZyhlZmZfY2opICsgbG9nKHBjdG1pbjgwICogZGVuc2l0eSksIGRhdGEgPSBkYXRhMikKY3JpbWVfZGVuc2l0eV8yX21kJGNvZWZmaWNpZW50cwpgYGAKCmBgYHtyfQpwbG90KGNyaW1lX2RlbnNpdHlfMl9tZCkKYGBgCgpgYGB7cn0KcGxvdChjcmltZV9kZW5zaXR5XzJfbWQkZml0dGVkLnZhbHVlcywgbG9nKGRhdGEyJGNybXJ0ZSksIG1haW4gPSAiQWN0dWFsIHZzIFByZWRpY3RlZCIpCmFibGluZShhPTAsYj0xKQpgYGAKCgpgYGB7cn0Kc3RhcmdhemVyKGRlbnNpdHlfbWluX21kLCB3dHJkX3dlc3RfbWQsIGNyaW1lX2RlbnNpdHlfMl9tZCwgdHlwZSA9ICJ0ZXh0IikKYGBgCgoK